﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {

    /// <summary>
    /// アニメーション イベントをあらわす構造体
    /// </summary>
    /// <remarks>
    //
    /// <see cref="AnimationTrack"/> には設定されたポジションでユーザー定義のハンドラー（メソッド）を呼び出す機能があります。
    /// これをアニメーション イベントと言います。この <see cref="AnimationEvent"/> はそのイベント情報を保持する構造体です。
    /// イベントが起きるポジション、呼び出されるハンドラー（メソッド）、任意の引数の3つから構成されます。
    /// アニメーション イベントはクリップの再生中ではなく、<see cref="Attachable.Raise()"/> メソッドを呼び出すと
    /// 条件を満たすイベントが呼び出されます。
    /// <para>
    /// <h3>アニメーション イベントの詳細</h3>
    /// TBD
    /// </para>
    /// </remarks>
    /// <seealso cref="AnimationTrack"/>
    /// <seealso cref="Attachable.Raise"/>
    public struct AnimationEvent {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <remarks>
        /// <see cref="AnimationEvnet"/> オブジェクトを作成します。
        /// </remarks>
        /// <param name="position">イベント ポジション</param>
        /// <param name="handler">イベント ハンドラー</param>
        /// <param name="args">イベント引数</param>
        internal AnimationEvent (int position, AnimationEventHandler handler, EventArgs args)
            : this () {
            this.Position = position;
            this.Handler = handler;
            this.Args = args;
        }
        /// <summary>
        /// イベントの発生するポジション
        /// </summary>
        public int Position { get; private set; }

        /// <summary>
        /// イベントで呼び出されるハンドラー
        /// </summary>
        /// <remarks>
        /// イベントの発生時に呼び出されるハンドラーです。
        /// </remarks>
        /// <seealso cref="AnimationEventHandler"/>
        public AnimationEventHandler Handler { get; private set; }

        /// <summary>
        /// ハンドラーに渡される引数
        /// </summary>
        /// <remarks>
        /// ハンドラー（メソッド）に渡される引数オブジェクトです。
        /// <see cref="EventArgs"/> を継承してユーザーが自由に作成可能です。
        /// </remarks>
        /// <seealso cref="EventArgs"/>
        public EventArgs Args { get; private set; }
    }
}
